package com.telit.uav.dao;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.telit.uav.dto.SimpleCommUavDto;
import com.telit.uav.dto.TaskInfo;
import com.telit.uav.dto.UavQueryDTO;
import com.telit.uav.dto.UpdateUavLanAndLonDTO;
import com.telit.uav.entity.CommUav;
import com.telit.uav.vo.*;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;


@Repository
public interface CommUavDao {
    int deleteByPrimaryKey(Long id);

    int insert(CommUav record);

    int insertSelective(CommUav record);

    CommUav selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(CommUav record);

    int updateByPrimaryKey(CommUav record);

    /**
     * 条件查询无人机列表
     * @param uavCode
     * @param isOnline
     * @return
     */
    List<CommUav> queryByCondition(@Param("uavCode")String uavCode, @Param("isOnline")Integer isOnline);

    /**
     * 根据无人机code查询任务信息
     * @param uavCode
     * @return
     */
    List<TaskInfo> queryTaskByUavCode(@Param("uavCode")String uavCode);
    /**
     * 无人机上线
     * @param uavCode
     * @param forestkeeperId
     * @param isConnect
     */
    void addStatus(@Param("uavCode")String uavCode, @Param("forestkeeperId")Long forestkeeperId, @Param("isConnect")int isConnect);

    /**
     * 删除关联表数据
     * @param uavCode
     */
    void deleteStatus(@Param("uavCode")String uavCode,@Param("forestkeeperId")Long forestkeeperId);


    /**
     * 查询无人机在离线状态
     * @param uavCode
     * @return
     */
    String queryIsConnect(String uavCode);

    /**
     * 更新关联表状态
     * @param taskId
     */
    void updateStatus(@Param("taskId")Long taskId,@Param("protectorId") Long protectorId);

    /**
     * 根据districtCode查询districtName
     * @param districtCode
     * @return
     */
    String queryDistrictNameByCode(@Param("districtCode")String districtCode);

    /**
     * 根据id查询name
     * @param id
     * @return
     */
    String queryNameById(@Param("id")Long id);

    /**
     * 根据code查询控制人id
     * @param uavCode
     * @return
     */
    Long queryUavController(@Param("uavCode")String uavCode);


    /**
     * 查询在线无人机
     *
     * @param uavCode
     *
     * @return
     */
    List<CommUav> queryOnlineUav(@Param("uavCode") String uavCode, @Param("isFlying") Integer isFlying,
                                 @Param("isOnline") Integer isOnline);

    /**
     * 查询在线无人机
     *
     * @param uavName
     *
     * @return
     */
    List<CommUav> queryOnlineUav2(@Param("uavName") String uavName, @Param("isFlying") Integer isFlying,
                                  @Param("districtCode") String districtCode);

    /**
     * 查询离线无人机
     *
     * @param uavCode
     *
     * @return
     */
    List<CommUav> queryUnOnlineUav(@Param("uavCode") String uavCode);

    /**
     * 查询离线无人机
     *
     * @param uavName
     *
     * @return
     */
    List<CommUav> queryUnOnlineUav2(@Param("uavName") String uavName, @Param("districtCode") String districtCode);

    /**
     * 查询全部无人机
     *
     * @param uavCode
     *
     * @return
     */
    List<UavVO> queryAllUav(@Param("uavCode") String uavCode, @Param("isFlying") Integer isFlying,
                            @Param("cityCode") String cityCode, @Param("cityCodelength") Integer cityCodelength);

    /**
     * 查询全部无人机
     *
     * @param uavName
     *
     * @return
     */
    List<CommUav> queryAllUav2(@Param("uavName") String uavName, @Param("isFlying") Integer isFlying,
                               @Param("districtCode") String districtCode);

    /**
     * 查询执行状态
     *
     * @param code
     *
     * @return
     */
    Long queryStatus(@Param("uavCode") String code);

    /**
     * 查询所有在线无人机信息，返回List<Map<String,Object>>
     * @return
     */
    List<Map<String, Object>> selectListMap();

    /**
     * 根据无人机name查询无人机信息
     *
     * @param uavName
     *
     * @return
     */
    CommUav queryUavInfoByUavName(@Param("uavName") String uavName);

    CommUav queryUavInfoByUavCode(@Param("uavCode") String uavCode);

    /**
     * 根据code查询name
     *
     * @param uavCode
     *
     * @return
     */
    String queryNameByCode(@Param("uavCode") String uavCode);

    /**
     * 查询无人机个数
     * @return
     */
    Integer uavTotal(@Param("isFlying") Integer isFlying);

    /**
     * 根据名称查询无人机列表
     * @param uavName
     * @return
     */
    List<CommUav> queryByName(@Param("uavName") String uavName);

    /**
     * 查询无人机是否已存在
     * @param uavCode
     * @return
     */
    Long queryByCodeOrName(@Param("uavCode")String uavCode, @Param("uavName") String uavName);

    /**
     * 查询所有无人机设备厂商
     * @return
     */
    List<Map<String,Object>> selectUavProducter();

    /**
     * 根据设备厂家Id查询无人机型号
     * @return
     */
    List<Map<String, Object>> selectUavModelByProId(@Param("producterId") Long producterId);

    /**
     * 根据uavCode查询token值
     * @param uavCode
     * @return
     */
    String selectTokenByUavCode(@Param("uavCode") String uavCode);

    /**
     * app端调用,修改无人机是否飞行中
     * @param uavCode
     * @param isFlying
     */
    void updateIsFlying(@Param("uavCode") String uavCode, @Param("isFlying") Integer isFlying);

    /**
     * 根据无人机code查询已连接飞手id
     * @param uavCode
     * @return
     */
    Long queryFlyControllerByCode(@Param("uavCode")String uavCode);

    /**
     * 查询前4个无人机信息
     * @return
     */
    List<CommUav> queryPositionCamera();

    /**
     * 根据id查询设备类型
     * @param id
     * @return
     */
    String queryNameByEquipmentModelId(Long id);

    /**
     * 根据id查询设备厂商
     *
     * @param id
     *
     * @return
     */
    String queryNameByEquipmentManufacturerId(Long id);

    List<CommUav> queryByHealthStatusAndName(@Param("healthStatus") Integer healthStatus,
                                             @Param("uavName") String name);

    void updateHealthStatus(@Param("healthStatus") Integer faultType, @Param("uavId") Long uavId);


    List<UavIsOnlineSumVO> queryByIsOnlineSum(@Param("cityCodelength") Integer cityCodelength,
                                              @Param("uavCode") String uavCode,
                                              @Param("isOnline") Integer isOnline,
                                              @Param("cityCode") String cityCode,
                                              @Param("isFlying") Integer isFlying);


    List<UavIsOnlineSumVO> queryUavByCityCode(@Param("uavCode") String uavCode,
                                              @Param("isOnline") Integer isOnline,
                                              @Param("cityCode") String cityCode,
                                              @Param("isFlying") Integer isFlying,
                                              @Param("districtCode") String districtCode);

    @Select("select shi_name from geo_xzqh_shi  where shi=#{shi}")
    String fingAllShiName(String shi);

    @Select("select xian_name from geo_xzqh_xian  where xian=#{xian}")
    String fingXianName(String xian);


    List<XqVO> fingAllQuName(String shi);

    List<UavVO> findAllUav(String xian);


    void changeIsOnLine(@Param("uavCode") String uavCode,
                        @Param("isOnline") Integer isOnline);

    UavVO queryUavById(@Param("id") Long id);

    List<SimpleCommUavDto> querySimpleDataByCondition(@Param("radius") String radius,
                                                      @Param("longitude") String longitude,
                                                      @Param("latitude") String latitude,
                                                      @Param("districtCode") String districtCode);


    IPage<UavVO> listUavByPage(IPage<UavVO> uavIPage, @Param("uavQueryDTO") UavQueryDTO uavQueryDTO);

    IPage<UavDeviceProducterVO> listDeviceProducterByPage(@Param("ipage") IPage<UavDeviceProducterVO> ipage,
                                                          @Param("name") String name);

    List<CommUavModelVO> listDeviceModelByPage(@Param("name") String name);

    @Select("select count(0) from comm_uav_model  where producter_id=#{id} and delete_time is null")
    Integer findProducter(@Param("id") Long id);

    @Select("select count(0) from comm_uav  where equipment_model=#{id}")
    Integer findModel(@Param("id") String id);


    /**
     * 查询无人机token
     *
     * @return
     */
    List<String> selectUavToken();

    /**
     * 根据token查询无人机数量
     *
     * @param uavToken
     *
     * @return
     */
    int selectUavCountBytoken(@Param("uavToken") String uavToken);

    void updateUavLonAndLan(@Param("updateUavLanAndLonDTO") UpdateUavLanAndLonDTO updateUavLanAndLonDTO);

    String getNameByDistrictCode(@Param("code") String code, @Param("codeLength") Integer codeLength);

    List<CommUav> queryList(@Param("uavName") String uavName, @Param("uavCode") String uavCode,
                            @Param("isFlying") Integer isFlying, @Param("districtCode") String villageDistrictCode);

    List<CommUav> queryListLike(@Param("uavName") String uavName, @Param("uavCode") String uavCode,
                                @Param("isFlying") Integer isFlying, @Param("districtCode") String villageDistrictCode);

    List<Map<String, Object>> queryStatusByCodeList(@Param("uavCodeList") List<String> uavCodeList);

    List<Map<String, Object>> queryConnectAndUserIdByCodeList(@Param("uavCodeList") List<String> uavCodeList);

}